package com.hbnu.tools;

import com.hbnu.entity.FileStat;
import com.hbnu.entity.UserFile;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import static com.hbnu.tools.PathTool.calcPath;
import static com.hbnu.web.Client.*;
import static com.hbnu.web.Client.idUserFileMap;

public class UserFileTool {
    //文件描述map
    public static final Map<Integer, FileStat> fileStatMap=new HashMap<>();

    //初始化userFileMap
    public static Map<Integer, UserFile> initUserFileMap(ResultSet resultSet) throws SQLException {
        Map<Integer, UserFile> idUserFileMap=new HashMap<>();
        while (resultSet.next()){
            int fid= resultSet.getInt(1);
            int pid= resultSet.getInt(2);
            String fname= resultSet.getString(3);
            int fileId= resultSet.getInt(4);
            boolean is_file= resultSet.getBoolean(5);
            // String path="~";
            //可能已经有人创建了fid,儿子先到
            if(idUserFileMap.containsKey(fid)){
                idUserFileMap.get(fid).set(pid,fname,fileId,is_file);
            }
            else
                idUserFileMap.put(fid,new UserFile(fid,pid,fname,fileId,is_file));

            //判断父级有没有到
            if(idUserFileMap.containsKey(pid)) {
                idUserFileMap.get(pid).addList(fid);//到了回归
            }else {
                //父级没到，先帮忙创建
                UserFile userFile = new UserFile(pid);
                userFile.addList(fid);
                idUserFileMap.put(pid, userFile);
            }
        }
        return idUserFileMap;
    }
    //根据fid更新pathMap
    public static Map<String, Integer> getPathMap(int fid,Map<Integer, UserFile> idUserFileMap) {
        Map<String, Integer> pathIdMap=new HashMap<>();
        //根root
        pathIdMap.put("~",fid);
        UserFile rootFile =idUserFileMap.get(fid);
        //子文件生成路径
        if(rootFile.hasChildren()) {
            Queue<Integer> queue = new LinkedList<>(rootFile.getList());
            while (!queue.isEmpty()) {
                Integer i = queue.poll();
                UserFile userFile = idUserFileMap.get(i);
                //保存子路径
                if (userFile.hasChildren()) {
                    queue.addAll(userFile.getList());
                }
                //获得路径
                String pPath = idUserFileMap.get(userFile.getPid()).getPath();
                userFile.setPath(pPath + "/" + userFile.getFname());
                pathIdMap.put(userFile.getPath(), i);
            }
        }
        return pathIdMap;
    }


    //用户文件中,地址转id
    public static int pathToFid(String p){
        String path = calcPath(folder.getPath(), p);
        Integer fid = pathIdMap.get(path);
        //路径不存在
        if(null==fid) {
            throw new RuntimeException("路径不存在");
        }
        return fid;
    }
    //用户文件中,id判断
    public static int idToFid(String id){
        int fid;
        try {
            fid =Integer.parseInt(id);
        }catch (Exception e){
            throw new RuntimeException(id+"无效");
        }
        if(!idUserFileMap.containsKey(fid)) {
            throw new RuntimeException("路径不存在");
        }
        return fid;
    }
    //用户文件中,获得文件id
    public static int getFile(String p,boolean is_path){
        //
        int fid = is_path?pathToFid(p):idToFid(p);
        if(!idUserFileMap.get(fid).is_file()) {
            throw new RuntimeException("不是文件！");
        }
        return fid;
    }
    //用户文件中,获得文件夹id
    public static int getFolder(String p,boolean is_path){
        int fid = is_path?pathToFid(p):idToFid(p);
        if(idUserFileMap.get(fid).is_file()) {
            throw new RuntimeException("不是文件夹！");
        }
        return fid;
    }
    //用户文件中,判断文件夹下，是否存在该名称
    public static boolean existFName(Integer fid, String name) {
        UserFile file = idUserFileMap.get(fid);
        if(!file.hasChildren()) return false;
        for(int i:file.getList()) {
            if(idUserFileMap.get(i).getFname().equals(name))
                return true;
        }
        return false;
    }

    //用户文件中,获取文件夹下的文件list
    public static List<Integer> getFileIdList(int fid){
        List<Integer> list=new ArrayList<>();
        Queue<Integer> queue=new LinkedList<>();
        queue.add(fid);
        while (!queue.isEmpty()){
            fid=queue.poll();
            UserFile userFile = idUserFileMap.get(fid);
            if(userFile.is_file()){
                list.add(userFile.getFile_id());
            }else if(userFile.hasChildren()){
                queue.addAll(userFile.getList());
            }
        }
        return list;
    }

    //用户文件中,从父级移除
    public static void removeChild(UserFile userFile) {
        List<Integer> list = idUserFileMap.get(userFile.getPid()).getList();
        //不修饰成对象，会删索引
        list.remove(Integer.valueOf(userFile.getFid()));
    }

    //用户文件中
    // 取出父级地址+新名字,删除原地址、添加新地址--->rename 只需要修改修改原名字
    //取出新父级地址+名字,删除原地址、添加新地址--->mv 只需要修改父id
    public static void updatePathMap(Integer id) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(id);
        while (!queue.isEmpty()) {
            Integer fid = queue.poll();
            UserFile file = idUserFileMap.get(fid);
            //保存子路径
            if (file.hasChildren()) {
                queue.addAll(file.getList());
            }
            //修改路径
            String path = file.getPath();
            String pPath = idUserFileMap.get(file.getPid()).getPath();
            file.setPath(pPath + "/" + file.getFname());
            pathIdMap.remove(path);
            pathIdMap.put(file.getPath(), fid);

        }
    }

    //用户文件中,获取全部fid
    public static List<Integer> getFidList(int fid){
        List<Integer> list=new ArrayList<>();
        Queue<Integer> queue=new LinkedList<>();
        queue.add(fid);
        while (!queue.isEmpty()){
            fid=queue.poll();
            UserFile userFile = idUserFileMap.get(fid);
            if(userFile.hasChildren()){
                queue.addAll(userFile.getList());
            }
            list.add(fid);
        }
        return list;
    }

    //获得唯一名
    public static String getUniqueUserFileName(Integer fid, String name) {
        // 如果名字不重合，则直接返回原名称
        if (!existFName(fid,name)) {
            return name;
        }
        // 获取文件的基本名称和扩展名
        int dotIndex = name.lastIndexOf('.');
        String baseName = (dotIndex == -1) ? name : name.substring(0, dotIndex);
        String extension = (dotIndex == -1) ? "" : name.substring(dotIndex);

        // 生成新文件名
        int count = 1;
        String newFileName;

        // 循环检查生成的新文件名是否已经存在
        do {
            newFileName = baseName + "_" + count + extension;
            count++;
        } while (existFName(fid,newFileName));

        // 返回新的文件路径
        return newFileName;
    }
}
